using System;
using Core;

/// <summary>
/// 反射工具
/// </summary>
public static class ReflexUtils
{
    #region 对象相关

    /// <summary>
    /// 取对象字段值
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="fieldName"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool GetFieldValue<T>(object obj, string fieldName, out T value)
    {
        value = default;
        try
        {
            var ts = obj.GetType();
            var fieldInfo = ts.GetField(fieldName);
            if (fieldInfo == null)
            {
                return false;
            }

            var o = fieldInfo.GetValue(obj);
            value = (T)o;
        }
        catch (Exception ex)
        {
            log.err(ex);
        }

        return false;
    }

    // /// <summary>
    // /// 获取类中的属性
    // /// </summary>
    // /// <returns>所有属性名称</returns>
    // public static List<string> GetProperties<T>(T t)
    // {
    //     List<string> listStr = new List<string>();
    //     if (t == null)
    //     {
    //         return listStr;
    //     }
    //
    //     PropertyInfo[] properties = t.GetType()
    //         .GetProperties(BindingFlags.Instance | BindingFlags.Public);
    //     if (properties.Length <= 0)
    //     {
    //         return listStr;
    //     }
    //
    //     foreach (PropertyInfo item in properties)
    //     {
    //         string name = item.Name; //名称
    //         object value = item.GetValue(t, null); //值
    //
    //         if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))
    //         {
    //             listStr.Add(name);
    //         }
    //         else
    //         {
    //             GetProperties(value);
    //         }
    //     }
    //
    //     return listStr;
    // }
    //
    // /// <summary>
    // ///  获取类中的字段
    // /// </summary>
    // /// <returns>所有字段名称</returns>
    // public static List<string> GetFields<T>(T t)
    // {
    //     List<string> listStr = new List<string>();
    //     if (t == null)
    //     {
    //         return listStr;
    //     }
    //
    //     FieldInfo[] fields =
    //         t.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
    //     if (fields.Length <= 0)
    //     {
    //         return listStr;
    //     }
    //
    //     foreach (var item in fields)
    //     {
    //         string name = item.Name; //名称
    //         object value = item.GetValue(t); //值
    //
    //         if (item.FieldType.IsValueType || item.FieldType.Name.StartsWith("String"))
    //         {
    //             listStr.Add(name);
    //         }
    //         else
    //         {
    //             GetFields(value);
    //         }
    //     }
    //
    //     return listStr;
    // }
    //
    // /// <summary>
    // /// 设置对象属性值
    // /// </summary>
    // /// <param name="fieldName"></param>
    // /// <param name="value"></param>
    // /// <param name="obj"></param>
    // /// <returns></returns>
    // public static bool SetModelValue(string fieldName, string value, object obj)
    // {
    //     try
    //     {
    //         var ts = obj.GetType();
    //         var property = ts.GetProperty(fieldName);
    //         if (property == null) return false;
    //
    //         var v = Convert.ChangeType(value, property.PropertyType);
    //         property.SetValue(obj, v, null);
    //         return true;
    //     }
    //     catch (Exception ex)
    //     {
    //         log.err(ex);
    //     }
    //
    //     return false;
    // }

    #endregion
}